package com.sxj.corejava.code14_Lambda表达式;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;

public class Test08_创建Stream对象 {

    public static void main(String[] args) {
        // 方式一:Collection体系集合
        List<Integer> list = Arrays.asList(1, 2, 5, 7, 9, 11, 13, 15);
        // default Stream<E> stream()
        // 将集合转换成对应的Stream流
        Stream<Integer> stream = list.stream();
        // 使用终止操作的foreach进行测试
        // foreach用于遍历Stream中所有的元素
        // 其方法的参数是一个消费型接口
        stream.forEach(System.out::println);

        System.out.println("************************************************");

        // 方式二:Map体系集合
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "admin");
        map.put(2, "jack");
        map.put(3, "alex");
        map.put(4, "lucy");
        map.put(5, "john");
        // 需要将Map转换成Set再获取对应的Stream
        // 可以将Map中所有的key存放到set集合,然后再转换成Stream
        Stream<Integer> stream2 = map.keySet().stream();
        stream2.forEach(System.out::println);
        System.out.println("************************************************");
        Stream<Map.Entry<Integer, String>> stream3 = map.entrySet().stream();
        stream3.forEach(System.out::println);

        System.out.println("************************************************");
        // 方式三:数组类型,Arrays.stream(T[] t)
        String[] arr = {"admin", "lucy", "jack", "tom", "lily", "李白", "孙尚香", "程咬金"};
        Stream<String> stream4 = Arrays.stream(arr);
        stream4.forEach(System.out::println);

        System.out.println("************************************************");
        // 方式四:可变长参数,这个也属于数组,是一种特殊的数组
        // 通过Stream提供的静态方法of可以将一个可变长参数转换成Stream
        Stream<Integer> stream5 = Stream.of(1, 3, 4, 6, 7, 9, 12, 15, 18);
        stream5.forEach(System.out::println);

        System.out.println("************************************************");
        // 由于可变长参数是一种特殊的数组,因此,该方法也适用于数组
        String[] arr2 = {"南京", "苏州", "北京", "泰州", "扬州", "杭州", "徐州", "东京", "连云港", "张家港"};
        Stream<String> stream6 = Stream.of(arr2);
        stream6.forEach(System.out::println);

        System.out.println("************************************************");
        // 方式五:无限流,设置起始值以及后续值的变化规律,生成无限个元素
        UnaryOperator operator = UnaryOperator.identity();
        // 参数一:初始值
        // 参数二:一元运算符,UnaryOperator是一个函数式接口,且该接口中的方法做了默认实现
        // 如果使用默认实现,其规律为:下一个值与初始值一致
        // 我们如果使用默认的实现,其元素的值永远与初始值保持一致
//        Stream stream7 = Stream.iterate(10, operator);
//        stream7.forEach(System.out::println);
        // 我们也可以修改该方法
        // 函数式接口中参数表示当前元素的值,返回值表示下一个元素的值
        Stream stream7 = Stream.iterate(1, t -> t + 1);
        stream7.forEach(System.out::println);
    }

}
